﻿Shader "ShaderLab_Study/EdgeDepthNormal" {
	Properties {
		_MainTex ("Base (RGB)", 2D) = "white" {}
		_EdgeOnly ("Edge Only", Float) = 1.0
		_EdgeColor ("Edge Color", Color) = (0, 0, 0, 1)
		_BackgroundColor ("Background Color", Color) = (1, 1, 1, 1)
		_NormalSensitivity("Normal Sensitivity",Float) = 1.0
		_DepthSensitivity("Depth Sensitivity",Float) = 1.0
		_SampleDistance("Sample Distace",Float) = 1.0
	}
	SubShader {
		Pass {
			ZTest Always
			Cull Off
			ZWrite Off
			CGPROGRAM

			#pragma vertex vert
			#pragma fragment frag
			
			#include "UnityCG.cginc"
			
		    sampler2D _MainTex;
		    half4 _MainTex_TexelSize;
			float _EdgeOnly;
			float4 _EdgeColor;
			float4 _BackgroundColor;
			float _NormalSensitivity;
			float _DepthSensitivity;

			sampler2D _CameraDepthNormalsTexture;
			
			float _SampleDistance;//采样距离

			struct v2f
			{
				float4 pos:SV_POSITION;
				half2 uv[5]:TEXCOORD0; 
			};

			v2f vert(appdata_img v)
			{
				v2f o;
				o.pos = UnityObjectToClipPos(v.vertex);

				half2 uv = v.texcoord;

				o.uv[0] = uv;
				o.uv[1] = uv + _MainTex_TexelSize.xy * half2(1, 1) * _SampleDistance;
				o.uv[2] = uv + _MainTex_TexelSize.xy * half2(-1, -1) * _SampleDistance;
				o.uv[3] = uv + _MainTex_TexelSize.xy * half2(-1, 1) * _SampleDistance;
				o.uv[4] = uv + _MainTex_TexelSize.xy * half2(1, -1) * _SampleDistance;
				
				return o;

			}

			half CheckSame(half4 center, half4 sample)
			{
				half2 centerNormal = center.xy;
				float centerDepth = DecodeFloatRG(center.zw);
				half2 sampleNormal = sample.xy;
				float sampleDepth = DecodeFloatRG(sample.zw);

				half2 diffNormal = abs(centerNormal - sampleNormal) * _NormalSensitivity;
				int isSameNormal = (diffNormal.x + diffNormal.y) < 0.1;

				float diffDepth = abs(centerDepth - sampleDepth) * _DepthSensitivity;
				int isSameDepth = diffDepth < 0.1 * centerDepth;

				return isSameNormal * isSameDepth ? 1.0 : 0.0;
			}
			
			fixed4 frag(v2f i) : SV_Target
			{
				half4 sample1 = tex2D(_CameraDepthNormalsTexture,i.uv[1]);
				half4 sample2 = tex2D(_CameraDepthNormalsTexture,i.uv[2]);
				half4 sample3 = tex2D(_CameraDepthNormalsTexture,i.uv[3]);
				half4 sample4 = tex2D(_CameraDepthNormalsTexture,i.uv[4]);

				half edge = 1.0;

				edge *= CheckSame(sample1,sample2);
				edge *= CheckSame(sample3,sample4);
				
				
				fixed4 withEdgeColor = lerp(_EdgeColor, tex2D(_MainTex, i.uv[0]), edge);
				fixed4 onlyEdgeColor = lerp(_EdgeColor, _BackgroundColor, edge);
				return lerp(withEdgeColor, onlyEdgeColor, _EdgeOnly);

			}
			
	

			ENDCG

		}
	}
	FallBack Off
}
